/*
 * Nombre: DAOAsignaturaReticula.java
 * Version: 1.0.0
 * Diagrama: GAPI v2.3.1
 * Autor: Amado de Jesús Canté Cauich
 * Creado: 15-feb-2013
 * Caso de uso: MGPE1
 * Modificado:
 */
package DAO;

import AccesoBD.AccesoBaseDatos;
import Dominio.Asignatura;
import Dominio.Semestre;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Clase que controla la tabla de asignaturas de reticula academica en la base de datos.
 * 
 */
public class DAOAsignaturaReticula {
    private Connection conexion = null;
    public static final String TABLA_ASIGNATURA_RETICULA = "asignaturas_reticula";
    public static final String COLUMNA_ID_ASIGNATURA_SEMESTRE = "id_asignatura_semestre";
    public static final String COLUMNA_CVE_ASIGNATURA = "clave_asignatura";
    public static final String COLUMNA_CVE_SEMESTRE = "clave_semestre";
    private AccesoBaseDatos acceso = new AccesoBaseDatos();
    /**
     * Constructor que inicializa la conexion.
     */
    public DAOAsignaturaReticula(){
        this.conexion = this.acceso.abrirConexion();
    }
    /**
     * Cierra la conexion en la base de datos. 
     */
    public void cerrarConexionAAsignaturaReticula() {
        acceso.cerrarConexion(conexion);
    }
   /**
    * Registra asignaturas en la reticula academica.
    * @param semestres Arreglo de semestres.
    */ 
    public void insertarAsignaturaReticula(ArrayList<Semestre> semestres){
        Semestre semestre;
        int cveSemestre;
        String query;
        ArrayList<Asignatura> asignaturas;
        try{
            Statement sentencia = this.acceso.crearSentenciaBD(conexion);
            for(int i=0;i<semestres.size();i++){
                semestre = semestres.get(i);
                cveSemestre = semestre.getClaveSemestre();
                asignaturas = semestre.getListaDeAsignaturas();
                for(int j=0;j<asignaturas.size();j++){
                    query = "INSERT INTO "+TABLA_ASIGNATURA_RETICULA+" ("+COLUMNA_CVE_ASIGNATURA+","+COLUMNA_CVE_SEMESTRE+") VALUES('"
                            + asignaturas.get(j).getClaveAsignatura()+"','"+cveSemestre+"')";
                    sentencia.executeUpdate(query);
                }
            }            
        }catch (SQLException ex){
            System.out.println("Ocurrió un problema al tratar de registrar la asignatura");
        }
    }
    /**
     * Obtiene las asignaturas del semestre dado.
     * @param claveSemestre Clave de semestre
     * @return Las asignaturas del semestre dado.
     */
    public ArrayList<Asignatura> obtenerAsignaturasDeSemestre(int claveSemestre){
        ArrayList<Asignatura> asignaturas = new ArrayList<Asignatura>();
        DAOAsignatura daoAsignatura = new DAOAsignatura();
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT * FROM "+TABLA_ASIGNATURA_RETICULA+" WHERE "+COLUMNA_CVE_SEMESTRE+"='"+claveSemestre+"';";
            ResultSet resultado = sentencia.executeQuery(query);
            while(resultado.next()){
                int claveAsignatura = resultado.getInt(2);
                Asignatura asignatura = daoAsignatura.buscarAsignatura(claveAsignatura);
                asignaturas.add(asignatura);
            }
            return asignaturas;
        }catch (SQLException ex){
            System.out.println("Ocurrió un problema al tratar de obtener la asignatura");
        }
        return null;
    }
    /**
     * Obtiene la asignatura de la reticula.
     * @param idAsignaturaSemestre Clave del semestre de la asignatura
     * @return La asignatura encontrada.
     */
    public Asignatura obtenerAsignaturaDeReticula(int idAsignaturaSemestre){
        String query = "SELECT * FROM "+TABLA_ASIGNATURA_RETICULA+" WHERE "+COLUMNA_ID_ASIGNATURA_SEMESTRE+"='"+idAsignaturaSemestre+"';";
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(query);
            Asignatura asignatura = null;
            DAOAsignatura daoAsignatura = new DAOAsignatura();
            resultado.first();
            if(resultado.getRow() != 0){
                int claveAsignatura = resultado.getInt(2);//el 2 es la columna de Asignatura
                asignatura = daoAsignatura.buscarAsignatura(claveAsignatura);
            }
            daoAsignatura.cerrarConexionAAsignatura();
            return asignatura;
        }catch (SQLException ex){
            System.err.println("Problemas de SQL:\n"+ex.toString());
        }
        return null;
    }
    /**
     * Obtiene la clave de la asignatura dado un semestre.
     * @param cveAsignatura Clave de la asignatura a buscar.
     * @param cveSemestre Clave de semstre
     * @return Clave de la asignatura.
     */
    public int obtenerClaveAsignaturaSemestre(int cveAsignatura, int cveSemestre){
        String query = "SELECT * FROM "+TABLA_ASIGNATURA_RETICULA
                + " WHERE " + COLUMNA_CVE_ASIGNATURA + " = '" + cveAsignatura +"' AND "
                + COLUMNA_CVE_SEMESTRE + " = '" + cveSemestre +"'";
        int claveAsignaturaSemestre = -1;
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(query);
            resultado.first();
            if(resultado.getRow() != 0){
                claveAsignaturaSemestre = resultado.getInt(1);//el 1 es la columna de la clave
            }
        } catch (SQLException ex){
            System.err.println("Problemas de SQL:\n"+ex.toString());
        } finally {
            return claveAsignaturaSemestre;
        }
    }
    /**
     * Elimina asignaturads de la reticula academica.
     * @param claveSemestre Clave del semestre
     */
    public void eliminarAsignaturasReticula(int claveSemestre) {
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "DELETE FROM "+TABLA_ASIGNATURA_RETICULA
                    + " WHERE " + COLUMNA_CVE_SEMESTRE + " = '" + claveSemestre +"'";
            sentencia.executeUpdate(query);
        } catch (SQLException ex) {
            Logger.getLogger(DAOAsignaturaReticula.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
    
}
